using OhioState.AssetManaged;
using OhioState.Math;

namespace OhioState.Graphics
{
    /// <summary>
    /// An interface for transformations including rotations, scales and translations.
    /// </summary>
    public interface ITransform : IManipulator
    {
        /// <summary>
        /// Gets or sets the pivot point for any subsequent rotations.
        /// </summary>
        Vector3 RotationCenter { get; set; }
        /// <summary>
        /// Apply a rotation about the specificed axis.
        /// </summary>
        /// <param name="radians">The amount of rotation in radians.</param>
        /// <param name="axis">A <typeparamref name="Vector3"/> specifying the axis about which to rotate.</param>
        void Rotate(float radians, Vector3 axis);
        /// <summary>
        /// Apply a translation.
        /// </summary>
        /// <param name="x">The x-axis displacement.</param>
        /// <param name="y">The y-axis displacement.</param>
        /// <param name="z">The z-axis displacement.</param>
        void Translate(float x, float y, float z);
        /// <summary>
        /// Apply a translation.
        /// </summary>
        /// <param name="translate">A translation vector.</param>
        void Translate(Vector3 translate);
        /// <summary>
        /// Apply a scale.
        /// </summary>
        /// <param name="scaleX">The x-axis scale.</param>
        /// <param name="scaleY">The y-axis scale.</param>
        /// <param name="scaleZ">The z-axis scale.</param>
        void Scale(float scaleX, float scaleY, float scaleZ);
    }
    /// <summary>
    /// A tele-photo like camera zoom manipulator.
    /// </summary>
    public interface IZoomLens : IManipulator
    {
        /// <summary>
        /// Apply a zoom using the scale factor.
        /// </summary>
        /// <param name="zoom">A zoom scale factor. Less than one zooms in.
        /// Greater than one zooms out.</param>
        void ZoomLens(float zoom);
    }
}
